package com.huika.lib.utils;

import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.text.Html;
import android.text.TextUtils;
import android.widget.EditText;

/**
 * @author
 *         time：2012-8-6 下午7:47:10
 *         description: 字符串校验工具
 */
public class VerifyTool {
	final static String PLEASE_SELECT = "请选择...";

	/*
	 * 邮箱验证
	 * @parma email 需要验证得邮箱
	 */
	public static boolean isEmail(String email) {
		return Pattern.compile("^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$").matcher(email).matches();
	}

	/**
	 * 昵称验证
	 * 
	 * @param 需要验证的昵称
	 * */
	public static boolean isNickName(String nickName) {

		return StringTool.getChineseLength(nickName) >= 4 && StringTool.getChineseLength(nickName) <= 16 && Pattern.compile("[\\u4e00-\\u9fa5\\w]*").matcher(nickName).matches();
	}

	/**
	 * 验证密码格式, 只支持英文和数字.
	 * 
	 * @param pwd
	 * @return
	 */
	public static boolean verifyPasswordFormat(String pwd) {
		return Pattern.compile("[a-zA-Z0-9]*").matcher(pwd).matches();
	}

	/**
	 * 
	 * @description：验证手机号是否正确
	 * @author lihy
	 * @date 2014年9月5日 下午12:29:21
	 */
	public static boolean isMobileNO(String telephone) {
		if (TextUtils.isEmpty(telephone))
			return false;
//		Pattern pattern = Pattern.compile("^0?(13[0-9]|15[012356789]|17[012356789]|18[012356789]|14[57])[0-9]{8}$");
		Pattern pattern = Pattern.compile("^1[3,4,5,7,8][0-9]\\d{8}$");
		Matcher matcher = pattern.matcher(telephone);
		return matcher.matches();
	}

	/**
	 * 验证手机号是否正确;
	 * 
	 * @param mobiles
	 * @return
	 */
// public static boolean isMobileNO(String mobiles) {
// if (TextUtils.isEmpty(mobiles))
// return false;
// Pattern p = Pattern.compile("^1[3,4,5,7,8][0-9]\\d{8}$");
// Matcher m = p.matcher(mobiles);
// return m.matches();
// }

	/**
	 * @description：判断qq
	 * @author shicm
	 * @date 2014年8月28日 下午6:12:03
	 */
	public static boolean isCheckQq(String qq) {
		if (TextUtils.isEmpty(qq)) {
			return false;
		}
		Pattern p = Pattern.compile("^[1-9][0-9]\\d{3,12}$");
		Matcher m = p.matcher(qq);
		boolean flag = m.matches();
		return flag;
	}

	/**
	 * 验证电话号码及是否正确;
	 * 
	 * @param mobiles
	 * @return
	 */
	public static boolean isPhoneNO(String mobiles) {
		Pattern p = Pattern.compile("^\\d{10,12}$");
		Matcher m = p.matcher(mobiles);
		return m.matches();
	}

	/**
	 * 验证短信验证码是否正确;
	 * 
	 * @param mobiles
	 * @return
	 */
	public static boolean isSmsCode(String msgCode) {
		Pattern p = Pattern.compile("^\\d{6}$");
		Matcher m = p.matcher(msgCode);
		return m.matches();
	}

	/**
	 * 验证IP和端口的格式是否有误
	 * 
	 * @param ip
	 *            访问服务器 IP 地址
	 * @param port
	 *            访问服务器端口
	 * @return 校验ip和端口 return -1 ip 或者 port 为空. -2 ip格式错误. -3 port为数字 0 通过
	 * */
	public static final int verificateIPAndPort(String ip, String port) {

		if (null == ip || "".equals(ip) || null == port || "".equals(port)) {
			return -1;
		}

		try {
			Integer.parseInt(port);
		}
		catch (NumberFormatException e) {
			return -3;
		}

		Pattern pattern = Pattern.compile("\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b");
		Matcher matcher = pattern.matcher(ip.trim());
		if (matcher.matches()) {
			return 0;
		}
		else {
			return -2;
		}

	}

	/**
	 * 
	 * 方法概述：
	 * 
	 * @description 方法详细描述：验证输入是否为空，并给以定位提示
	 * @author lhy
	 * @param @param w
	 * @param @param displayStr
	 * @param @return
	 * @return boolean
	 * @throws
	 * @Title: VerifyTool.java
	 * @Package com.huika.huixin.utils
	 * @date 2014-4-21 上午11:52:09
	 */
	public static boolean isCheckEmpty(EditText w, String displayStr) {
		if (empty(w.getText().toString().trim())) {
			w.setError(Html.fromHtml("<font color=#aaaaaa>" + "请输入" + displayStr + "</font>"));
			w.setFocusable(true);
			// w.requestFocus();
			return true;
		}
		return false;
	}

	public static boolean empty(Object o) {
		return o == null || "".equals(o.toString().trim()) || "null".equalsIgnoreCase(o.toString().trim()) || "undefined".equalsIgnoreCase(o.toString().trim()) || PLEASE_SELECT.equals(o.toString().trim());
	}

	/**
	 * 
	 * 方法概述：
	 * 
	 * @description 方法详细描述：验证输入的金额为整数且只能有两个位小数
	 * @author lzt
	 * @param @param s
	 * @param @return
	 * @return boolean
	 * @throws
	 * @Title: VerifyTool.java
	 * @Package com.huika.huixin.utils
	 * @date 2014-4-28 下午12:46:14
	 */
	public static boolean monneyFormate(String s) {
		if (TextUtils.isEmpty(s))
			return false;

		Pattern pattern = Pattern.compile("^(-)?(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){1,2})?$");
		return pattern.matcher(s).matches();
	}

	
	/**
	 * @author:tsp
	 * @Title: isLength
	 * @Description: TODO(判断字符串的长度)
	 * @param @param str
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean isCheckLength(String str, int start, int end) {
		Pattern pattern = Pattern.compile("^.{" + start + "," + end + "}$");
		return pattern.matcher(str).matches();
	}
	
	/**是否存在中文字符*/
//    public static boolean isCN(String str){
//        try {
//            byte [] bytes = str.getBytes("UTF-8");
//            if(bytes.length == str.length()){//相等则全部都在ansi编码范围内
//                return false;
//            }else{
//                return true;
//            }
//        } catch (UnsupportedEncodingException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
//        return false;
//    }
	
//	/**8到16位，并且不以数字开头*/
//	public static boolean checkNoStartFormNum(String str) {
////		"^[A-Za-z].*[0-9]|[0-9].*[A-Za-z]{6,16}$"
//		Pattern pattern =Pattern.compile("^[\\D][A-Za-z0-9`~!@#$%\\^\\&\\*\\(\\)_\\+\\-=\\[\\]\\{\\}\\\\|;:'\"\\<,\\>\\.\\?/]{7,15}$");
//		boolean matches = pattern.matcher(str).matches();
//		return matches;
//	}
//	
//	
//	/**同时存在数字和字母*/
//	public static boolean checkPwd(String str) {
//		Pattern pattern =Pattern.compile("^.*[\\d]+.*$");
//		boolean matches1 = pattern.matcher(str).matches();
//		Pattern pattern2 =Pattern.compile("^.*[A-Za-z]+.*$");
//		boolean matches2 = pattern2.matcher(str).matches();
//		return matches1&&matches2;
//	}
	

	/**
	 * @author:tsp
	 * @Title: isLength
	 * @Description: TODO(判断身份证的长度)
	 * @param @param str
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean isCheckCardLenth(String str, int start, int end) {
		Pattern pattern = Pattern.compile("^[A-Za-z0-9].{" + start + "," + end + "}$");
		return pattern.matcher(str).matches();
	}

	/**
	 * @author:tsp
	 * @Title: isCheckCtSmallLength
	 * @Description: TODO(检查字符串长度为15)
	 * @param @param str
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean isCheckCtSmallLength(String str) {
		Pattern pattern = Pattern.compile("^.{15}$");
		return pattern.matcher(str).matches();
	}

	/**
	 * @author:tsp
	 * @Title: isCheckCtMaxLength
	 * @Description: TODO(检查字符串长度为18)
	 * @param @param str
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean isCheckCtMaxLength(String str) {
		Pattern pattern = Pattern.compile("^.{18}$");
		return pattern.matcher(str).matches();
	}

	/**
	 * 判断是否银行卡
	 */
	public static boolean isBankCard(String str) {
		if (TextUtils.isEmpty(str)) {
			return false;
		}
		String scard = str.trim();
		Pattern pattern = Pattern.compile("^\\d{12,1000}$");
		return pattern.matcher(scard).matches();
	}

	/**
	 * 
	 * @description：判断是否是身份证格式
	 * @author lihy
	 * @date 2014年8月29日 下午5:23:40
	 */
	public static boolean checkCardNo(String cardNo) {
		Pattern pattern = Pattern.compile("(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)");
		Matcher matcher = pattern.matcher(cardNo);
		return matcher.matches();
	}

	/**
	 * 判断中文
	 */
	public static boolean isChineseChar(String inputString) {
		Pattern pattern = Pattern.compile("^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$");
// Pattern pattern = Pattern.compile("^[\\u4E00-\\u9FA5]");
		return pattern.matcher(inputString).matches();
	}

	/**
	 * 匹配非负浮点数
	 */
	public static boolean isRealNumber(String inputString) {
		Pattern pattern = Pattern.compile("^[0-9]+(.[0-9]{1,5})?$");
		return pattern.matcher(inputString).matches();
	}

	/**
	 * 匹配非负浮点数
	 */
	public static boolean isNotNegativeFloat(String inputString) {
		Pattern pattern = Pattern.compile("^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$");
		return pattern.matcher(inputString).matches();
	}

	/**
	 * 手机号码截取成130****123类型字段，因为用之前方式 的话，诸如17999999990类似号码会截取成：17********0
	 * @description：
	 * @author ldm
	 * @date 2014年12月10日 上午10:57:44
	 */
	public static  String splitePhone(String phone) {
		String[] tel = new String[phone.length()];
		StringBuffer sb = new StringBuffer();
		if (tel.length > 0) {
			for (int i = 0; i < tel.length; i++) {
				if (i > 2 && i < 7) {
					sb.append("*");
				} else {
					sb.append(phone.charAt(i));
				}
			}
		}
		return sb.toString();
	}
	/**
	 * 身份证截取成
	 * @description：
	 * @author shicm
	 * @date 2014年12月10日 上午10:57:44
	 */
	public static  String spliteCard(String card) {
		String[] tel = new String[card.length()];
		StringBuffer sb = new StringBuffer();
		if (tel.length > 0) {
			for (int i = 0; i < tel.length; i++) {
				if (i != 0 && i != tel.length -1) {
					sb.append("*");
				} else {
					sb.append(card.charAt(i));
				}
			}
		}
		return sb.toString();
	}
	/**
	 * 邮箱显示处理，邮箱需要隐藏前面中间部分，如：2******9@qq.com （与web端一致） 
	 * @description：
	 * @author ldm
	 * @date 2014年12月10日 上午10:57:44
	 */
	public static String spliteEmail(String email) {
		String newEmail = email.split("@")[0];
		String[] mails = new String[newEmail.length()];
		StringBuffer sb = new StringBuffer();
		if (mails.length > 0) {
			if (mails.length < 3) {
				return email;
			} else {
				for (int i = 0; i < mails.length; i++) {
					if (i >= 1 && i <mails.length-1) {
						sb.append("*");
					} else {
						sb.append(newEmail.charAt(i));
					}
				}
				return sb.toString() +"@"+ email.split("@")[1];
			}
		}else{
			return "";
		}
	}
}
